@file:Suppress("unused", "MemberVisibilityCanBePrivate")

/**
 * # [AndroidX](https://developer.android.google.cn/jetpack/androidx/explorer)，为google官方提供的android扩展包。
 *
 * >旧版本叫support包，一开始提供扩展包的目的是为了方便在已发布的android版本上实现相同的功能，也便于更新迭代。
 * >到后来support包更类似于工具库，提供了很多官方组件，但由于版本管理混乱，常常出现使用的第三方包也依赖了某个版本的support
 * >包，导致包冲突，强行用同一个包还会出现方法找不到等问题。
 *
 * 于是，google重新整理了support包，将其更新为androidx，其中加入了各种各样的库，试图打造一个更便捷的开发环境，让开发者
 * 可以优先从androidx中选择需要的sdk，而且初见成效，不同于个人开发者的散装sdk，androidx库中很多库一起使用可以达到更好的
 * 效果，更新节奏上也更稳定，不像support包跟着android系统版本走。
 */
object AndroidX {

    /**
     * [core](https://developer.android.google.cn/jetpack/androidx/releases/core)
     *
     * androidx的核心包，里面主要提供了各个版本的兼容代码，比如常用的ContextCompat，还有一些核心组件，如
     * ComponentActivity FileProvider
     *
     * coreKtx是kotlin版本的core包，比java版本多了许多扩展方法，此包依赖了core包
     */
    const val coreKtx = "androidx.core:core-ktx:1.7.0"

    /**
     * [appcompat](https://developer.android.google.cn/jetpack/androidx/releases/appcompat)，提供一些
     * 主题化的系统组件，最常用的可能是AppCompatActivity，它提供了Toolbar替代ActionBar。
     *
     * 其他的一些类似与AppCompatButton，会在解析布局文件时自动将Button替换为该实现，以实现整体布局样式主题化。
     */
    const val appcompat = "androidx.appcompat:appcompat:1.4.0"

    /**
     * [activity](https://developer.android.google.cn/jetpack/androidx/releases/activity)
     *
     * 提供AndroidX包中的基础Activity（ComponentActivity）,该Activity扩展了LifeCycle、ViewModel、
     * registerForActivityResult等特性，不过这个包不用单独导入，appcompat已经依赖了这个包了
     */
    const val activity = "androidx.activity:activity-ktx:1.4.0"

    /**
     * [annotation](https://developer.android.google.cn/jetpack/androidx/releases/annotation)
     *
     * 注解包，提供各式各样的注解，如NonNull标记方法参数不为空，ColorRes表示参数为颜色资源id而不是颜色值
     * 这些东西虽然不用也可以，但使用的话，可以使某些问题可以在编译期就被发现并解决，减少谜之bug。
     */
    const val annotationX = "androidx.annotation:annotation:1.3.0"

    /**
     * [material](https://material.io/develop/android)
     *
     * 材料设计包，提供了很多卡片风格的组件，常用的例如AppBarLayout、CollapsingToolbarLayout等
     */
    const val material = "com.google.android.material:material:1.2.1"

    /**
     * [drawerlayout](https://developer.android.google.cn/jetpack/androidx/releases/drawerlayout)
     *
     * 侧滑菜单，快速实现侧滑菜单效果
     */
    const val drawerlayout = "androidx.drawerlayout:drawerlayout:1.1.1"

    /**
     * [recyclerview](https://developer.android.google.cn/jetpack/androidx/releases/recyclerview)
     *
     * 已经完全替代系统的ListView,GridView。可以轻松实现线性布局，表格，流式布局，不同样式item。
     * 青出于蓝的还有很多优化，比如在item大小在创建后是固定的，可以设置setHasFixedSize，跳过measure、layout阶段。
     * 其他比如setRecycledViewPool可以让多个一样item样式的RecyclerView共用item池。
     * ItemDecoration可以给Item绘制装饰器。
     */
    const val recyclerview = "androidx.recyclerview:recyclerview:1.2.1"

    /**
     * [viewpager](https://developer.android.google.cn/jetpack/androidx/releases/viewpager)
     *
     * 老朋友了，从support.v4包存留至今，几乎是每个应用都会用到的组件，就无需过多介绍了吧，目前
     * FragmentPagerAdapter已经标记为过时，官方推荐使用ViewPager2
     */
    const val viewpager = "androidx.viewpager:viewpager:1.0.0"

    /**
     * [viewpager2](https://developer.android.google.cn/jetpack/androidx/releases/viewpager2)
     *
     * google新推出的ViewPager，支持从右到左布局，支持垂直方向
     */
    const val viewpager2 = "androidx.viewpager2:viewpager2:1.1.0-beta01"

    /**
     * [cardview](https://developer.android.google.cn/jetpack/androidx/releases/cardview)
     *
     * 卡片视图，带圆角，带阴影，材料设计好搭档
     */
    const val cardview = "androidx.cardview:cardview:1.0.0"

    /**
     * [网格布局](https://developer.android.google.cn/jetpack/androidx/releases/gridlayout)
     */
    const val gridlayout = "androidx.gridlayout:gridlayout:1.0.0"

    /**
     * [multidex](https://developer.android.google.cn/jetpack/androidx/releases/multidex)
     *
     * 分包支持，用于解决android 64k方法数限制
     * 需在module build.gradle中开启分包：multiDexEnabled true
     * 为兼容低版本，需要在Application.attachBaseContext方法中调用MultiDex.install(this)
     */
    const val multidex = "androidx.multidex:multidex:2.0.1"

    /**
     * [constraintlayout](https://developer.android.google.cn/jetpack/androidx/releases/constraintlayout)
     *
     * 约束布局，减少布局层次的神器，子视图还可以通过参数设置宽高比，百分比位置，最主要的是所有视图都在一个布局里面，那视图
     * 的动画就可以在整个界面里面展示了，了不起。
     */
    const val constraintlayout = "androidx.constraintlayout:constraintlayout:2.1.1"

    //region compose--------------------------------------------------------------------------------

    /**
     * [compose](https://developer.android.google.cn/reference/kotlin/androidx/compose/runtime/rxjava3/package-summary?authuser:1)
     *
     * google尝试的一种新的ui框架，与Flutter类似，但不是底层基于View实现，而是完全新的一套ui框架，一度怀疑
     * 谷歌是不是想将这套框架推到ios开发，android直接可以套用过去。。。
     */
    const val composeVersion = "1.0.0-beta01"
    const val activityCompose = "androidx.activity:activity-compose:1.3.0-alpha02"
    const val composeUi = "androidx.compose.ui:ui:$composeVersion"

    // Tooling support (Previews etc.)
    const val composeUiTooling = "androidx.compose.ui:ui-tooling:$composeVersion"

    // Foundation (Border Background Box Image Scroll shapes animations etc.)
    const val composeFoundation = "androidx.compose.foundation:foundation:$composeVersion"

    // Material Design
    const val composeMaterial = "androidx.compose.material:material:$composeVersion"

    // Material design icons
    const val composeMaterialIconsCore =
        "androidx.compose.material:material-icons-core:$composeVersion"
    const val composeMaterialIconsExtended =
        "androidx.compose.material:material-icons-extended:$composeVersion"

    // Integration with observables
    const val composeRuntimeLivedata =
        "androidx.compose.runtime:runtime-livedata:$composeVersion"
    const val composeRuntimeRxjava2 = "androidx.compose.runtime:runtime-rxjava2:$composeVersion"

    // UI Tests androidTestImplementation
    const val composeUiTestJunit = "androidx.compose.ui:ui-test-junit4:$composeVersion"
    //endregion-------------------------------------------------------------------------------------

    /**
     * [databinding](https://developer.android.google.cn/jetpack/androidx/releases/databinding)
     *
     * 用于实现视图数据双向绑定，类似于jsp那种直接在布局文件里面将数据与视图绑定，感觉耦合太深了，我还是
     * 比较习惯手动将数据更新到视图，用这个一般只是为了方便找到控件，不用在Activity中写一堆控件变量。
     * databinding与gradle插件捆版，只需要在build.gradle添加以下代码即可开启dataBinding
     *
     *              android {
     *                  ...
     *                  buildFeatures {
     *                      dataBinding true
     *                  }
     *              }
     *
     *  这个包里是定义好的一些适配器，可以在布局文件中直接使用，如有特殊需求也可以自定义适配器，应该也在appcompat包
     *  中有依赖
     */
    const val databinding = "androidx.databinding:databinding-adapters:4.1.1"


    //region camera---------------------------------------------------------------------------------
    const val cameraVersion = "1.1.0-alpha04"

    /**
     * androidx camera包致力于解决camera使用复杂，还有各机型兼容性问题，可以很方便地实现app内预览、拍照、录像
     */
    const val cameraCore = "androidx.camera:camera-core:$cameraVersion"
    const val cameraCamera2 = "androidx.camera:camera-camera2:$cameraVersion"
    const val cameraLifecycle = "androidx.camera:camera-lifecycle:$cameraVersion"
    const val cameraView = "androidx.camera:camera-view:1.0.0-alpha24"

    //扩展包，支持添加人像 HDR 夜间模式 美颜等效果
    const val cameraExtensions = "androidx.camera:camera-extensions:1.0.0-alpha24"

    //endregion-------------------------------------------------------------------------------------

    //region lifecycle------------------------------------------------------------------------------

    /**
     * [lifecycle](https://developer.android.google.cn/jetpack/androidx/releases/lifecycle?hl=zh_cn#declaring_dependencies)
     *
     * 提供ui生命周期监听，极其方便，自从有了它，很多库的使用都不需要自己更具生命周期变化去调用相关方法，都被封装在第
     * 三方库中。这个组件已经被封装在AppCompat中，在activity、fragment中通过获取LifeCycleOwner来取得lifeCycle
     */
    const val lifecycleVersion = "2.4.0"


    /**
     * [LiveData](https://developer.android.google.cn/topic/libraries/architecture/livedata?hl=zh_cn)
     *
     * 用于提供变量值变化监听，其监听回调通过handler实现，所以主要使用场景就是监听数据更新ui，其监听支持
     * liveCycle，实现ui销毁自动注销监听，当然也需要在ui创建时去监听并更新ui。如果在fragment中使用，记得使用
     * viewLifeCycleOwner来提供lifeCycle。
     *
     * 其主要更新方法有(MutableLiveData):
     * setValue 立即更新数值并通知监听者
     * postValue post一个更新任务，并设置任务执行时要更新的数值，等到主线程执行该任务就将数值更新到变量，若已经存在更新
     * 任务则只更新任务中携带的值，实现连续post后等到主线程执行任务只更新最后的值。
     */
    const val livedata = "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycleVersion"

    /**
     * [ViewModel](https://developer.android.google.cn/topic/libraries/architecture/viewmodel?hl=zh_cn)
     *
     * 用于实现VM层，主要作用是存放页面数据，实现页面业务，其优点是对象通常由activity、fragment创建出来，
     * 由于不随生命周期影响，所以存储在里面的数据，在activity因配置改变重建，fragment视图销毁重建都可以恢复数据到视图。
     * 甚至于可以在fragment中通过activity来获取viewModel实例，实现数据共享。
     */
    const val viewmodel = "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycleVersion"

    /**
     * ViewModel 状态存储
     */
    const val viewmodelSavedState =
        "androidx.lifecycle:lifecycle-viewmodel-savedstate:$lifecycleVersion"

    /**
     * lifecycle编译期解析注解生成代码
     * kapt
     */
    const val lifecycleCompiler = "androidx.lifecycle:lifecycle-compiler:$lifecycleVersion"

    /**
     * 辅助在service中生成lifecycle
     */
    const val lifecycleService = "androidx.lifecycle:lifecycle-service:$lifecycleVersion"

    /**
     * 辅助在整个Application中提供一个LifeCycle(ProcessLifecycleOwner)
     */
    const val lifecycleApplication = "androidx.lifecycle:lifecycle-process:$lifecycleVersion"

    //endregion-------------------------------------------------------------------------------------

    //region datastore------------------------------------------------------------------------------

    const val datastoreVersion = "1.0.0"

    /**
     * [datastore](https://developer.android.google.cn/jetpack/androidx/releases/datastore?hl=zh_cn)
     *
     * google新出的Preferences封装框架，支持异步，支持Flow（Flow类似与RxJava、LiveData，他可以订阅
     * 变量变化，支持很多操作符）。比如通过框架存储一个值到本地，如果有人订阅了该值变化，则会自动收到更新通知。
     */
    const val datastore = "androidx.datastore:datastore:$datastoreVersion"

    //支持rxjava3的版本
    const val datastoreRxjava3 = "androidx.datastore:datastore-rxjava3:$datastoreVersion"

    //datastore的核心包，不依赖android api
    const val datastoreCore = "androidx.datastore:datastore-core:$datastoreVersion"
    const val datastorePreferences = "androidx.datastore:datastore-preferences:$datastoreVersion"
    const val datastorePreferencesRxjava3 =
        "androidx.datastore:datastore-preferences-rxjava3:$datastoreVersion"
    const val datastorePreferencesCore =
        "androidx.datastore:datastore-preferences-core:$datastoreVersion"
    //endregion-------------------------------------------------------------------------------------

    //region room-----------------------------------------------------------------------------------
    const val roomVersion = "2.3.0"

    /**
     * [room](https://developer.android.google.cn/jetpack/androidx/releases/room?hl=zh_cn)数据库
     *
     * 基于android原生数据库的封装，就dao等功能来说比不上greenDao，但其强大的地方却是其他框架难以企及的，
     * 它支持Flow，比如查询一张表，返回一个Flow来观察查询数据的变化，一旦有操作修改了这张表，即会通过Flow的监听通知到各
     * 个界面，牛逼。以谷歌这个生态，散装sdk估计有难了，除非散装sdk也去支持这些androidx的包。
     */
    const val roomRuntime = "androidx.room:room-runtime:$roomVersion"
    const val roomCompiler = "androidx.room:room-compiler:$roomVersion"
    const val roomKtx = "androidx.room:room-ktx:$roomVersion"
    const val roomRxjava2 = "androidx.room:room-rxjava2:$roomVersion"
    const val roomGuava = "androidx.room:room-guava:$roomVersion"

    //testImplementation
    const val roomTesting = "androidx.room:room-testing:$roomVersion"
    //endregion-------------------------------------------------------------------------------------

}



